lexical analysis in compiler design